import java.util.*;


public class code2 {
    /**
     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
     *
     *
     * @param grid int整型ArrayList<ArrayList<>> 
     * @return int整型
     */
    int[] dx = {0,0,1,-1};
    int[] dy = {1,-1,0,0};
    public int rotApple (ArrayList<ArrayList<Integer>> grid) {
        int m = grid.size();
        int n = grid.get(0).size();
        boolean[][] vis = new boolean[m][n];//如果原数组可以改变，直接在原数组上进行修改即可
        Queue<int[]> q =new LinkedList<>();
        //找到2的位置
        for(int i=0;i<m;i++) {
            for(int j=0;j<n;j++) {
                if(grid.get(i).get(j)==2) {
                    q.add(new int[]{i,j});
                }
            }
        }
        int ret = 0;
        while(!q.isEmpty()) {
            int sz = q.size();
            while(sz--!=0) {
                int[] t = q.poll();
                int a = t[0],b = t[1];
                for(int i=0;i<4;i++) {
                    int x = a+dx[i];
                    int y = b+dy[i];
                    if(x>=0&&x<m&&y>=0&&y<n&&vis[x][y]==false&&grid.get(x).get(y)==1) {
                        vis[x][y]=true;
                        q.add(new int[]{x,y});
                    }
                }
            }
            ret++;
        }
        //返回-1
        for(int i=0;i<m;i++) {
            for(int j=0;j<n;j++) {
                if(grid.get(i).get(j)==1 && !vis[i][j]) return-1;
            }
        }

        return ret-1;
    }
}